
package com.liangtian.mdm.dm.model.service.impl;


import com.liangtian.mdm.dm.attribute.dao.AttributeDao;
import com.liangtian.mdm.dm.common.constant.TableConst;
import com.liangtian.mdm.dm.config.dao.AttrConfigDao;
import com.liangtian.mdm.dm.group.dao.AttrGroupDao;
import com.liangtian.mdm.dm.listener.CacheUtil;
import com.liangtian.mdm.dm.model.dao.ModelDao;
import com.liangtian.mdm.dm.model.model.Model;
import com.liangtian.mdm.dm.model.service.ModelService;
import com.liangtian.mdm.system.menu.dao.MenuDao;
import com.liangtian.mdm.system.business.dao.SysBusinessDao;
import com.liangtian.mdm.system.business.model.SysBusiness;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

@SuppressWarnings({"unchecked", "rawtypes"})
@Service
public class ModelServiceImpl implements ModelService {
    // import com.liangtian.mdm.activiti.busi2proc.dao.BusinessProcdefDao;
// import com.liangtian.mdm.activiti.busi2proc.model.ProcdefTasks;
    // 注入动态模型dao接口
    @Autowired
    private ModelDao modelDao;

    // 注入属性Dao
    @Autowired
    private AttributeDao attributeDao;

    // 注入属性Dao
    @Autowired
    private AttrConfigDao attrConfigDao;

    // 注入属性组Dao
    @Autowired
    private AttrGroupDao attrGroupDao;

    // 注入菜单Dao
    @Autowired
    private MenuDao sysMenuDao;

    // 注入业务类型Dao
    @Autowired
    private SysBusinessDao sysbusDao;

    //注入缓存CacheUtil
    @Autowired
    private CacheUtil cacheUtil;

    // @Autowired
    // private BusinessProcdefDao businessProcdefDao;

    /**
     * Title: 测试 模型定义 首页数据的加载
     *
     * @author : 张涛
     * @date :2016年7月20日下午1:21:51
     */
    @Override
    public Object queryDemo(Map map) {
        Object pageInfo = null;
        try {
            Object pNo = map.get("pageNum");
            // export
            if (pNo != null && !"NaN".equals(pNo)) {
                int pageNum = Integer.parseInt(pNo.toString());// 模型定义页面要显示数据 例如
                int pageSize = Integer.parseInt(map.get("limit").toString());// 模型定义页面要显示数据条数
                PageHelper.startPage(pageNum, pageSize);// 开始分页标志（当前页，显示条数）
            }
            List<Model> modelMapList = modelDao.queryAllModelListByCondition(map);

            if (pNo == null) {
                System.out.println("-------export all-------");
                pageInfo = modelMapList;
            } else {
                pageInfo = new PageInfo(modelMapList);
            }
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        return pageInfo;
    }

    /**
     * <p>Title: 查询动态模型定义中 模型查询数据</p>
     *
     * @author : xiaoliu
     * @date :2016年7月8日下午12:59:22
     */
    @Override
    public PageInfo queryAllModelListByCondition(Map<String, Object> map) {
        /**
         * @desc 获取全部用户信息(包含查询)
         * @param user
         * @params参数详情 pageNum 总页数
         * @params参数详情 length 每页显示条数
         * @params参数详情 start 起始条数
         * @params参数详情 draw 请求次数
         * @return 分页条件下的
         */
        PageInfo<List<Model>> pageInfo = null;
        try {
            Object pNo = map.get("pageNum");
            int pageNum, pageSize;
            // export
            if (pNo != null && !"NaN".equals(pNo)) {
                pageNum = Integer.parseInt(pNo.toString());// 页码
            } else {
                pageNum = 1;
            }
            // pageSize=0时不分页
            pageSize = Integer.parseInt(map.get("limit").toString());// 模型定义页面要显示数据条数
            PageHelper.startPage(pageNum, pageSize);// 开始分页标志（当前页，显示条数）

            List<Model> modelMapList = modelDao.queryAllModelListByCondition(map);
            pageInfo = new PageInfo(modelMapList);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return pageInfo;

    }

    /***
     * 动态模型定义新增方法
     * @author : xiaoliu
     * @date :2016年7月12日上午9:51:51
     */
    @Override
    public int insertModel(Model model) {
        model.setTableName(TableConst.TABLEPREFIX);        // T_ + id
        return modelDao.insertModel(model);
    }

    /**
     * Title: 模型定义 模型修改功能
     *
     * @author : xiaoliu
     * @date :2016年7月20日下午1:22:47
     */
    @Override
    public void updateModel(Model models) {
        modelDao.updateModel(models);
        cacheUtil.removeElement(models.getId());
    }

    /**
     * 通过主键查询模型
     */
    @Override
    public Model selectByPk(String modelId) {
        Model model = modelDao.selectByPk(modelId);
        return model;
    }

    /**
     * <p>Description: 校验模型名称</p>
     *
     * @author : xiaoliu
     * @date :2016年9月29日上午9:37:52
     */
    @Override
    public int checkModelName(Model model) {
        return modelDao.checkModelName(model);
    }

    /**
     * <p>Description: 根据条件，查询，符合条件的模型</p>
     *
     * @author : xiaoliu
     * @date :2016年9月29日上午9:38:23
     */
    @Override
    public List<Model> queryTables(Model model) {
        return modelDao.queryTables(model);
    }

    /**
     * ??? 逻辑是否正确
     * <p>Description: 物理删除功能</p>
     *
     * @author : xiaoliu
     * @date :2016年9月29日上午9:37:24
     * ===============================
     * 刘晶 2017-7-6 8:54am 此方法更改，
     * 主要是针对删除模型操作那块业务类型出现的bug（模型删除，业务类型依然存在那项）
     * ===============================
     */
    @Override
    public int modelDel(String[] ids) {
        List<String> idsLst = Arrays.asList(ids);
        Map<String, Object> map = new HashMap<>();
        map.put("idsList", idsLst);

        //应该通过model.is_menu_create判断；存在menu才删，还有业务类型呢。
        sysMenuDao.batchDeleteMenuByModelId(map);
        //删除属性列表属性
        attributeDao.batchDeleteAttrubuteByModelId(map);
        //删除属性设置列
        attrConfigDao.batchDeleteAttrConfigByModelId(map);


        //动态的删除业务类型
        for (int i = 0; i < ids.length; i++) {
            //删除属性组
            attrGroupDao.deleteGroupByModelId(ids[i]);

            //查询模型是否创建菜单
//			List<Menu> menuLst = sysMenuDao.queryMenuByModelId(ids[i]);
//			if(menuLst.size()>0){//创建了菜单
//				//应该通过model.is_menu_create判断；存在menu才删，还有业务类型呢。
//				//sysMenuDao.batchDeleteMenuByModelId(map);
//				sysMenuDao.deleteMenuByMId(ids[i]);
//			}
            //删除业务类型
            //==查询是否存在业务类型
            SysBusiness sysBusiness = sysbusDao.selectBusByTable("T_" + ids[i]);
            if (null != sysBusiness) {
                //存在
                sysbusDao.deleteBusByMId("T_" + ids[i]);
                //是否设置流程
                // List<ProcdefTasks> taskLst = sysbusDao.selectAllProtasks(sysBusiness.getBusTable());
                // if (!taskLst.isEmpty()) {
                //     List<String> idLst = new ArrayList<String>();
                //     for (ProcdefTasks procdefTasks : taskLst) {
                //         idLst.add(procdefTasks.getId());
                //     }
                //     //删除业务流程以及流程任务
                //     businessProcdefDao.deleteBusProcdefById(taskLst.get(0).getBusProId());
                //     businessProcdefDao.deleteProTasks(idLst);
                // }
            }
            //删除业务类型表里主表对应的从表
            List<Model> Lst = modelDao.isHasSub(ids[i]);
            if (!Lst.isEmpty()) {
                List<String> tableNameLst = new ArrayList<String>();
                for (Model model : Lst) {
                    tableNameLst.add(model.getTableName());
                    //删除属性组
                    attrGroupDao.deleteGroupByModelId(model.getId());
                }
                Map<String, Object> cond = new HashMap<>();
                cond.put("idsList", tableNameLst);
                sysbusDao.deleteBusByBusTables(cond);
                sysMenuDao.batchDeleteMenuByModelId(cond);
                //删除属性列表属性
                attributeDao.batchDeleteAttrubuteByModelId(cond);
                //删除属性设置列
                attrConfigDao.batchDeleteAttrConfigByModelId(cond);
            }
        }
        //attributeDao.batchDeleteAttrubuteByModelId(map);
        //应该通过model.is_menu_create判断；存在menu才删，还有业务类型呢。
        //sysMenuDao.batchDeleteMenuByModelId(map);

        int delConts = modelDao.modelDel(map);
        for (String modelId : ids) {
            cacheUtil.removeElement(modelId);
        }
        return delConts;
    }

    /***
     * ??? 逻辑是否正确
     *  模型删除中逻辑删除方法
     * @author : xiaoliu
     * @date :2016年7月18日下午1:56:13
     */
    @Override
    public int editByID(List<String> ids) {
        attributeDao.updateAttributeIsDelDelModel(ids);
        Map<String, Object> map = new HashMap<>();
        map.put("idsList", ids);
        //应该通过model.is_menu_create判断；存在menu才删，还有业务类型呢。
        sysMenuDao.batchDeleteMenuByModelId(map);
        //动态的删除业务类型
        for (int i = 0; i < ids.size(); i++) {
            SysBusiness sysBusiness = sysbusDao.selectBusByTable("T_" + ids.get(i));
            sysbusDao.deleteBusByMId("T_" + ids.get(i));
            if (null != sysBusiness) {
                // List<ProcdefTasks> taskLst = sysbusDao.selectAllProtasks(sysBusiness.getBusTable());
                // if (!taskLst.isEmpty()) {
                //     List<String> idLst = new ArrayList<String>();
                //     for (ProcdefTasks procdefTasks : taskLst) {
                //         idLst.add(procdefTasks.getId());
                //     }
                //     //删除业务流程以及流程任务
                //     businessProcdefDao.deleteBusProcdefById(taskLst.get(0).getBusProId());
                //     businessProcdefDao.deleteProTasks(idLst);
                // }
            }
            //删除业务类型表里主表对应的从表
            List<Model> Lst = modelDao.isHasSub(ids.get(i));
            if (!Lst.isEmpty()) {
                List<String> tableNameLst = new ArrayList<String>();
                for (Model model : Lst) {
                    tableNameLst.add(model.getTableName());
                }
                Map<String, Object> cond = new HashMap<>();
                cond.put("idsList", tableNameLst);
                sysbusDao.deleteBusByBusTables(cond);
            }
        }
        int delConts = modelDao.modelDel(map);
//			for(String modelId : ids){
//				cacheUtil.removeElement(modelId);
//			}
        return delConts;
    }

    /**
     * <p>TODO</p>
     * @param : @param oldModelId
     * @param : @param modelName
     * @param : @return
     * @author : xiaoliu
     * @date :2017年3月21日下午5:08:19
     */

//	@Override
//	public int modelCopy(String oldModelId, String modelName) {
//		Map<String, Object> map = new HashMap<>();
//		map.put("oldId", oldModelId);
//		map.put("modelName", modelName);
//		Model oldModel = modelDao.selectByPk(oldModelId);//获取旧模型
//		Model newModel = new Model();
//		newModel.
//		return modelDao.modelCopy(map);
//
//	}

}
